#!user/bin/env python3
# -- coding: utf-8 --
# 【私有属性私有方法】
"""
私有属性私有方法是不能被子类继承的
设置私有权限的格式：在属性名和方法名 前面 加上两个下划线__。
注意：私有属性和方法只能在类里面访问和修改
在Python中，一般定义函数名get_xx用来获取私有属性，定义set_xx用来修改私有属性值，先获取后修改
"""


class ZhangWuJi(object):
    def __init__(self):
        self.jineng = '九阳神功'
        self.__baodao = '屠龙刀'

    # 获取私有属性get__xx
    def get_baodao(self):
        return self.__baodao

    # 修改私有属性set_xx
    def set_baodao(self):
        self.__baodao = '倚天剑'

    def gongfu(self):
        print(f'使用{self.jineng}攻击玄冥二老')

    def __秘密(self):
        print(f'{self.__baodao}藏在黑匣子岛金毛狮王谢逊手里，谁也拿不走')


class ZhaoMin(ZhangWuJi):
    pass


duixiang1 = ZhaoMin()
# print(duixiang1.jineng)  # 公有属性可以调用
# print(duixiang1.__baodao)  # 私有属性不可以调用
# duixiang1.gongfu()  # 公有方法可以调用
# duixiang1.__秘密()  # 私有方法不可以调用
print(''.center(50, '~'))
print(duixiang1.get_baodao())  # 查看获取的私有属性
duixiang1.set_baodao()  # 先修改私有属性
print(duixiang1.get_baodao())  # 在查看修改的私有属性
print(''.center(50, '~'))


# 如何获取父类的私有方法
class 张三丰(object):
    def __init__(self):
        self.技能 = '太极掌'

    def 实用方法(self):
        print(f'使用{self.技能}攻击')


class 叶问(张三丰):
    def __init__(self):
        self.技能 = '咏春拳'

    def 实用方法(self):
        print(f'使用{self.技能}攻击')
        super().__init__()
        super().实用方法()


class 李小龙(叶问):
    def __init__(self):
        self.技能 = '截拳道'

    def 实用方法(self):
        self.__init__()
        print(f'使用{self.技能}攻击')


    # def 张三丰_实例方法(self):#与父类同名属性和方法，调用父类属性方法
    #     张三丰.__init__(self)
    #     张三丰.实用方法(self)

    def 叶问_实例方法(self):
        叶问.__init__(self)
        叶问.实用方法(self)

    # 一次性调用两个人的同名属性和方法
    def 张三丰和叶问_实例方法(self):
        # 张三丰.__init__(self)
        # 张三丰.实用方法(self)
        # 叶问.__init__(self)
        # 叶问.实用方法(self)
        super().__init__()
        super().实用方法()
        """
        使用super()可以自动查找父类。调用顺序遵循__mro__类属性的顺序。比较适合单继承使用。
        代码量没有明显减少，但是可以规避别人修改了类名我们不知情造成报错。
        """

对象1 = 李小龙()
对象1.实用方法()
对象1.叶问_实例方法()
print(''.center(30, '='))
对象1.张三丰和叶问_实例方法()
print(''.center(50,'='))